package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class test3copy {
    public static void main(String[] args) throws IOException {
        //从src文件夹里的文件拷贝到dest文件夹里
        File src = new File("E:\\src");
        File dest = new File("E:\\dest");

        copydir(src, dest);
    }

    private static void copydir(File src, File dest) throws IOException {
        //首先创建一个多级文件夹
        //第一次是dest文件夹
        dest.mkdirs();
        //1.进入src文件夹，获取src文件夹里的所有文件和文件夹
        File[] files = src.listFiles();
        //遍历数组进入src文件夹里
        for (File file : files) {
            //file表示src文件夹里的文件或者文件夹

            //细节：  拷贝是把源头文件名和源文件内容都拷贝到目标文件当中，并且目标文件名和源文件名相同
            if (file.isFile()) {
                //如果是文件就进行拷贝
                //拷贝文件用字节流
                //创建字节流
                FileInputStream fis = new FileInputStream(file);
                //拷贝细节：
                /*
                从源头文件读取数据就要在目的地文件里创建一个和源文件名相同的文件
                从文件开始就要从文件结束
                比如src文件夹下有  a.txt，我们就要在dest文件夹下创建一个a.txt
                 */
                FileOutputStream fos = new FileOutputStream(new File(dest, file.getName()),false);
                //读取数据
                int len;
                byte[]bytes = new byte[1024];
                //边读边写

                while ((len = fis.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
                //关闭流
                fos.close();
                fis.close();
            } else {
                //如果是文件夹就递归，递归出file要为文件才可以
                //细节： 递归的src一定是src里面的文件或者文件夹，要缩小src文件夹的内容
                //这个file就是src里的文件夹, new File(dest, file.getName())就是这个dest文件夹里面创建了一个和src里的文件夹名字相同的文件夹
                //真正的创建是这个程序：    dest.mkdirs();
                copydir(file, new File(dest, file.getName()));
            }
        }

    }
}
